package com.tianji.api.config;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.tianji.api.cache.CategoryCache;
import com.tianji.api.client.course.CategoryClient;
import com.tianji.api.dto.course.CategoryBasicDTO;
import org.springframework.context.annotation.Bean;

import java.time.Duration;
import java.util.Map;

public class CategoryCacheConfig {
    /**
     * 课程分类的caffeine缓存
     */
    @Bean//使用该注解，pring容器将自动检测并创建这些 Bean，使它们可以在应用程序的其他部分被注入和使用
    //这个方法创建并配置了一个 Caffeine 缓存实例，用于存储课程分类数据。
    public Cache<String, Map<Long, CategoryBasicDTO>> categoryCaches(){
        return Caffeine.newBuilder()
                .initialCapacity(1) // 容量限制
                .maximumSize(10_000) // 最大内存限制
                //设置缓存的有效期为写入后 30 分钟。
                // 这意味着一旦数据被写入缓存，它将保留 30 分钟，除非在这段时间内再次写入或访问
                .expireAfterWrite(Duration.ofMinutes(30)) // 有效期
                .build();
    }
    /**
     * 课程分类的缓存工具类
     * @param categoryCaches：一个 Cache 对象，用于存储分类数据，
     * 其中 String 是缓存的键，Map<Long, CategoryBasicDTO> 是缓存的值，键是分类的 ID，值是分类的详细信息
     * @param categoryClient：一个 CategoryClient 对象，用于从远程服务或数据库中获取分类数据
     * @return
     */
    @Bean
    //这个方法创建了一个 CategoryCache 实例，它是一个缓存工具类，用于操作课程分类的缓存数据。
    public CategoryCache categoryCache(Cache<String, Map<Long, CategoryBasicDTO>> categoryCaches, CategoryClient categoryClient){
        return new CategoryCache(categoryCaches, categoryClient);
    }
}
